package com.free.semantic.core.impl.demo;

import com.free.semantic.common.Ls;
import com.free.semantic.common.RelationChain;
import com.free.semantic.common.RelationItem;
import com.free.semantic.core.ConceptInstanceManage;
import com.free.semantic.core.ConceptManage;
import com.free.semantic.core.impl.BaseTest;
import com.free.semantic.core.impl.ConceptInstanceManageImpl;
import com.free.semantic.core.script.SemanticNetEngine;
import com.free.semantic.core.script.impl.ScriptEngineImpl;
import com.free.semantic.core.takeclient.ConceptInsTakeCommand;
import com.free.semantic.core.takeclient.impl.LocalManageImpl;
import com.free.semantic.core.takeclient.impl.UrlClientImpl;
import com.free.semantic.req.RelationDefineGroup;
import org.junit.jupiter.api.Test;

import java.util.List;


/**
 *
 */
public class Demo11_manageClient extends BaseTest {

    @Test
    public void test() {


        /**
         * 创建第一个语义模型
         */
        RelationDefineGroup group = new RelationDefineGroup();
        // relation 包含(A,B)
        defineRelation(group, "包含",
                defineItem(oneObj("A"), moreObj("B")), //A->B=[0,) //代表 针对任意一个A，都可以找到 [0,)个B与之对应
                defineItem(oneObj("B"), oneObj("A"))); //B->A=1  //代表 针对任意一个B，都可以找到 1个A与之对应

        //  使用包含关系 定义一个语义网络
        ConceptManage model = getConceptManage(group);
        //object 省份 城市
        object(model, "省份", "城市");
        //包含(省份,城市)
        createRelation(model, "包含", "省份", "城市");

        //创建模型的一个实现，并且实现 省份查询城市  和  城市查询 省份 函数（添加一些测试数据）
        ConceptInstanceManage modelInstance = new ConceptInstanceManageImpl(model);


        LocalManageImpl localMange = new LocalManageImpl(modelInstance);

        SemanticNetEngine semanticNetEngine = new ScriptEngineImpl();

        ConceptManage conceptManage = semanticNetEngine.buildManageFromTake(localMange);


        List<RelationChain> chainList = conceptManage.findAllRelationChain(Ls.of("省份"), "城市");

        assert chainList.size() == 1;

        RelationChain chain = chainList.get(0);

        RelationItem relationItem = chain.toRelationItem();

        assertObj(relationItem.getSourceObjectList(), "省份");
        assertObj(relationItem.getDestObject(), "城市");


        System.out.println(conceptManage);


    }

    @Test
    void test2() {

        // 暴露出接口信息出来
        LocalManageImpl localMange = null;

        {
            /**
             * 创建第一个语义模型
             */
            RelationDefineGroup group = new RelationDefineGroup();
            // relation 包含(A,B)
            defineRelation(group, "包含",
                    defineItem(oneObj("A"), moreObj("B")), //A->B=[0,) //代表 针对任意一个A，都可以找到 [0,)个B与之对应
                    defineItem(oneObj("B"), oneObj("A"))); //B->A=1  //代表 针对任意一个B，都可以找到 1个A与之对应

            //  使用包含关系 定义一个语义网络
            ConceptManage model = getConceptManage(group);
            //object 省份 城市
            object(model, "省份", "城市");
            //包含(省份,城市)
            createRelation(model, "包含", "省份", "城市");
            //创建模型的一个实现，并且实现 省份查询城市  和  城市查询 省份 函数（添加一些测试数据）
            ConceptInstanceManage modelInstance = new ConceptInstanceManageImpl(model);

            // 暴露出接口信息出来
            localMange = new LocalManageImpl(modelInstance);

        }


        SemanticNetEngine semanticNetEngine = new ScriptEngineImpl();

        ConceptManage conceptManage = semanticNetEngine.buildManageFromTake(localMange);


        /**
         * 创建第一个语义模型
         */
        RelationDefineGroup group = new RelationDefineGroup();
        // relation 包含(A,B)
        defineRelation(group, "包含",
                defineItem(oneObj("A"), moreObj("B")), //A->B=[0,) //代表 针对任意一个A，都可以找到 [0,)个B与之对应
                defineItem(oneObj("B"), oneObj("A"))); //B->A=1  //代表 针对任意一个B，都可以找到 1个A与之对应

        //  使用包含关系 定义一个语义网络
        ConceptManage model = getConceptManage(group);
        //object 省份 城市
        object(model, "省份1", "城市1");
        //包含(省份,城市)
        createRelation(model, "包含", "省份1", "城市1");

        //创建模型的一个实现，并且实现 省份查询城市  和  城市查询 省份 函数（添加一些测试数据）
        ConceptInstanceManage modelInstance = new ConceptInstanceManageImpl(model,
                buildMap("省份1", "城市1", new String[][]{
                        {"浙江", "杭州"}, {"浙江", "金华"},
                        {"山西", "长治"}, {"山西", "运城"},
                        {"广东", "广州"}, {"广东", "珠海"}}));


        StringBuilder builder = new StringBuilder();
        builder.append("eq 省份=省份1").append("\n");
        builder.append("eq 城市=城市1").append("\n");
        SemanticNetEngine engine = new ScriptEngineImpl();

        // 完成接口适配的实现
        ConceptInstanceManage instanceManage = engine.execScript(conceptManage, builder.toString(), modelInstance);


        // 用户提供的
        String sourceLocation = "take (省份,山西)";// 最终形式应该是  http://yumingxinx/xxxx/take (省份,山西);  最终标识的是自己的位置

        // 应该是          UrlClientImpl client = new UrlClientImpl(“http://yumingxinx/xxxx/take (省份,山西)”);
        UrlClientImpl client = new UrlClientImpl(instanceManage, sourceLocation);

        String citys = client.getValue("城市");
        System.out.println(citys);
        assert citys.equals("[\"长治\",\"运城\"]");

    }





    void test3() {

        // 暴露出接口信息出来
        ConceptInsTakeCommand localMange = null;

        localMange = new UrlClientImpl("https://localhost/manage/general_controller/concept/interfaceModel/");

        SemanticNetEngine semanticNetEngine = new ScriptEngineImpl();

        ConceptManage conceptManage = semanticNetEngine.buildManageFromTake(localMange);


        /**
         * 创建第一个语义模型
         */
        RelationDefineGroup group = new RelationDefineGroup();
        // relation 包含(A,B)
        defineRelation(group, "包含",
                defineItem(oneObj("A"), moreObj("B")), //A->B=[0,) //代表 针对任意一个A，都可以找到 [0,)个B与之对应
                defineItem(oneObj("B"), oneObj("A"))); //B->A=1  //代表 针对任意一个B，都可以找到 1个A与之对应

        //  使用包含关系 定义一个语义网络
        ConceptManage model = getConceptManage(group);
        //object 省份 城市
        object(model, "省份1", "城市1");
        //包含(省份,城市)
        createRelation(model, "包含", "省份1", "城市1");

        //创建模型的一个实现，并且实现 省份查询城市  和  城市查询 省份 函数（添加一些测试数据）
        ConceptInstanceManage modelInstance = new ConceptInstanceManageImpl(model,
                buildMap("省份1", "城市1", new String[][]{
                        {"浙江", "杭州"}, {"浙江", "金华"},
                        {"山西", "长治"}, {"山西", "运城"},
                        {"广东", "广州"}, {"广东", "珠海"}}));


        StringBuilder builder = new StringBuilder();
        builder.append("eq 省份=省份1").append("\n");
        builder.append("eq 城市=城市1").append("\n");
        SemanticNetEngine engine = new ScriptEngineImpl();

        // 完成接口适配的实现
        ConceptInstanceManage instanceManage = engine.execScript(conceptManage, builder.toString(), modelInstance);


        // 用户提供的
        String sourceLocation = "take (省份,山西)";// 最终形式应该是  http://yumingxinx/xxxx/take (省份,山西);  最终标识的是自己的位置

        // 应该是          UrlClientImpl client = new UrlClientImpl(“http://yumingxinx/xxxx/take (省份,山西)”);
        UrlClientImpl client = new UrlClientImpl(instanceManage, sourceLocation);

        String citys = client.getValue("城市");
        System.out.println(citys);
        assert citys.equals("[\"长治\",\"运城\"]");

    }

}